How Many Ratings Are Needed?

Introduction

This work builds on my first (and failed) attempt to estimate how many ratings one needs to sample for obtaining a dependable measure of a certain population. Therefore, readers are advised to catch up on my previous work to be up to speed on this smaller project.

As the unconventional approach did not yield the desired results, we will revert back to the more “old school” methodologies of an a priori power analysis. That is, estimating the minimum sample size needed to uncover a set effect size (or larger), given a significance level and type II (false negatives) error.

Though in light of such an endeavor, we have two problems:

  • Setting a (numerical) effect size depends on the polarization measure itself, and in how we define polarization in the first place.
  • We do not have an actual significance test for polarization, hence we can not define when a distribution is polarized or not.

To solve these problems, the following proposals were taken for this work:

  • 4 preset distributions were chosen, each with differing grade of polarization (and hence different effect size), and will serve as proxies for our assumed population distributions for 4 different risks.
  • For the replacement of a polarization test, we calculate the measures of bimodality coefficient (BC), polarization and group divergence. These measures were chosen from the prior simulation work, as they seemed like good measures of polarization. We will then proceed in categorizing a distribution as “polarized” when values reach a preset threshold, and “not polarized” if the value falls below the threshold.

Method

Population Distributions

While most of the previous distributions were used again (with the same color as last time) some adjustments were made. Notably, we’ve transitioned to a 11 -point likert scale, which our group has chosen to use for the upcoming study. Here are the distributions with some comments:

  • None (a normal Distribution, but this time with a shifted mean instead of the midpoint), representing a risk where a consensus is established.
  • Small polarization (the skewed beta distribution from prior work was replaced with this one, representing a smaller polarization in the population)
  • Rare (a majority rating on one extreme, while a minority group with base rate of 5% on the other extreme)
  • Strong polarization (still the symmetrical version, but this time in discrete shape)

It is important to note that while the normal and strong polarization distribution represent no and strong effects, the small and rare distributions should both illustrate small effects in the population, and putting one over the other really depends on how to interpret/ operationalize polarization itself (e.g. asymmetry, distance, agreement etc…).

Procedure

For this work, we will use different sample sizes consisting of 20 different sizes:

##  [1]  10  20  30  40  50  60  70  80  90 100 110 120 130 140 150 160 170 180 190
## [20] 200

For each sample size, we replicate the random draw 200 times.

As mentioned in the introduction, we will use thresholds for each polarization measure to determine whether polarization is present or not. Luckily, the BC already has a set threshold of \(0.\overline{5}\).

For the two other measures, previous results were consulted. Realization that the measurement of polarization has a low value for the rare distribution (even lower than the normal distribution, as it uses a weighted sum, thus small groups are discounted), leads to a crucial implication. Setting a low threshold for rare distributions in order to identify them as polarized will also net us too many false negatives (e.g. saying normal distributions are polarized). To note, group divergence values in the previous simulation ranged from .24 and .9, while the measure of polarization ranged from .1 to .8. Hence the threshold for group divergence and polarization were (arbitrarily) set at 0.5 and 0.5 respectively.

To summarize, 4 different population distribution were created and serve as our effect sizes, the thresholds functions as a proxy for when we actually reject or accept that the sampled distribution is polarized (similar to the alpha value and p-values), and thus we use different effect sizes to estimate the power.

Again, this is how our sampled matrix looks like, adopting a staircase like shape. Using this method saves us time, as well as prevents errors.

After we’ve calculated the polarization measures for each of the 16000 drawn samples, the measures were put into a data frame. As we can see, no missing values are here, indicating that each measure was calculated successfully.

Expectations

It is expected that with greater sample size, we would have a more accurate and reliable estimate of the population distribution. Though if the measures of polarization in the population distributions were lower than our set thresholds, then said measures will never indicate polarization (except due to random noise). To illustrate expected pitfalls of the current approach, here is a fitting analogy, where the polarization measures functions as prediction models in classification problems:

  • Good models with high accuracy can find polarization in case it is polarized (sensitivity), and differentiates distributions as not polarized in case it is not polarized (specificity).

  • If the measure differentiates the distribution with no polarization and high polarization clearly (e.g. difference of numerical values of said distributions are big), we would correctly categorize them more often according to the threshold.

  • Using the logic from the previous point, if the model itself is accurate, setting the threshold is not as important. For example, if the polarization measure gives two numerical outputs for two different distributions like .2 and .9, then setting the threshold at .5 or .6 would not matter for the categorization itself. In consequence, if the measure is pretty bad at distinguishing the distributions, like .5 and .6, then we have less margin for error regarding the threshold selection, as the thresholds itself needs to be set in between those values to categorize them correctly.

  • Setting the threshold may increase true positives at the expense of false positives and vice verca. One can always set the threshold at .1 or .9, thus having a low or high entry point where one would classify polarization (thus taking a liberal or conservative approach).

Taking all of these points into account, the power analysis results mainly hinges on the polarization measurements itself and how fitting the threshold were set.

Results

Overall

Polarization Values for the Population Distribution

Polarization Measures in the Population Distributions
Population Distribution Bimodality Coefficient Group Divergence Polarization
None 0.345 0.287 0.152
Small Pol. 0.736 0.377 0.359
Rare 0.766 0.762 0.185
Strong Pol. 0.884 0.804 0.823

Drawn Sample Table

Overall Plot

Bimodality Coefficient

Plot

Bimodality Coefficient Table

Group Divergence

Plot

Group Divergence Table

Polarization

Plot

Polarization Table

Discussion

Looking over the results, the measures of group divergence and polarization were of no help. Two possible explanations (which is already discussed further above) come to mind:

  • The thresholds were not optimally set (e.g. if the threshold were set in a better position, then we are more likely to find polarization, at the cost of finding false positives as well). For example, the threshold for group divergence was too high, so it never categorized the small polarization distribution as polarized. In this case, we’ve restrained the effect size to be at least at 0.5, which may be too restrictive for this measure.

  • The measure itself have difficulties distinguishing polarization (or at least how I defined polarization). Take for example the rare distribution, which I defined as truly polarized, and compare it with the not polarized distribution. Their values are near identical. As a reminder, polarization uses weighted sums to calculate polarization. In consequence, it ignores the minority group in the rare distribution, and focuses on the bigger group on the left, which just happens to be a skewed normal distribution.

On the other hand, the BC delivers a totally acceptable and logical output:

  • All polarized distributions are categorized as polarized, whereas the distribution without polarization is categorized as not polarized.

  • With increased sample size, we have more power.

  • The strongly polarized distribution reaches a high power level the fastest, wheras small and rare polarizations are slower due to their implied effect sizes. Bare in mind that rare distributions need bigger sample sizes, so that the probability of sampling from the minority group is sufficiently high.

But on a more thorough investigation, we see that the simulation for the BC indicates a sample size of 20 and 30 is enough to get a power of 80% for the small polarization distribution and rare distribution respectively…. Interpreting this result in a more favorable way, it seems like we’ve only found the bare minimum sample size needed (and even this interpretation is shaky, as the simulation uses random draws in perfect conditions, which does not translate well to our study). In a more realistic (and thus pessimistic way), the results seem to suggest that this approach (again) does not seem to give a satisfactory answer to our problem at hand. A sample size of 20 and 30 is very small and intuitively leads to unreliable outcomes. Using such a small sample size to infer how a population thinks/ feels about certain risks is out of the question.

Limitations

  • Only 3 measures of polarization was used, and thus, not every aspect of polarization was covered.

  • Setting the assumption that the rare polarization is, in fact, polarized, may not hold well in the study itself, as outliers, misinterpretations or even a mouse slip may contribute to such a distribution, which we would then just assume is polarized.

  • The threshold were set somewhat arbitrary, and therefore, may not hold in the real deal. One might be tempted to change the threshold to find an optimized one where we would have the least false positives and false negatives, but this threshold will only fit the distributions seen here and will not generalize for others. As such, I’ll refrain from finding the optimum, as it would not net us any additional insight to our goal.

  • Likewise, one could set the thresholds for the BC even higher, thus restricting the amount of ambivalent distributions which were barely making the cutoff. This would lead to a greater sample size needed, but we would have a more reliable and hopefully a more realistic approximation of how many sampled need to be drawn.

  • As in all classification problems, polarization has no clear cut limit and should be understood as a gradient where some risks are more polarized than others. The threshold implies that distributions just short of the threshold is significantly less polarized then those just above it, which can’t be further from the truth.

  • In this simulation, samples were drawn at random. Our sampling procedure may not be as random as in this simulation (maybe only those who answer our questionnaires are those on one pole, among other sampling difficulties).

  • It could also be that the “small polarization” is still a big effect size in the real world. If that is the case, using such a small sample will only lead to a lack of power to find polarization.

Conclusions

  • This approach failed to deliver a clear cut answer in finding the needed sample size to find polarization in case there is one.

  • Only the lower limit was found, but due to numerous reasons outlined in the limitations, it is adviced to increase the number…

  • For those who are curious what would happen if we would change the thresholds, feel free to download the code and change the numbers yourself. I’ve put the variables in the first chunk so it is practical to do so.

Credits

R Packages Used

Use of AI

ChatGPT 3.5 (OpenAI. 2023, https://chat.openai.com/chat):

  • Symbiotic writing of this whole document. The author wrote the first draft, and used the LLM for rephrasing work, which were mostly taken as inspiration. All sections were equally affected.
LS0tDQp0aXRsZTogIlJpc2sgUG9sYXJpemF0aW9uIFBvd2VyIEFuYWx5c2lzIg0KYXV0aG9yOiAiQW5keSBDYW8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICAgaHRtbF9kb2N1bWVudDoNCiAgICAgICNjc3M6IHN0eWxlcy5jc3MNCiAgICAgIHRvYzogdHJ1ZQ0KICAgICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9jb250cm9sbDogZmFsc2UNCiAgICAgIGZpZy53aWR0aDogMjYNCiAgICAgIGZpZy5oZWlnaHQ6IDI2DQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCmBgYHtyIFNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpICNkYXRhIHdyYW5nbGluZyBhbmQgb3RoZXIgdG9vbHMgZm9yIFINCmxpYnJhcnkoa25pdHIpICMgcmVwb3J0IGdlbmVyYXRpb24gaW4gUg0KbGlicmFyeShwc3ljaCkgI2NhbGN1bGF0ZSBza2V3IGFuZCBrdXJ0b3NpcyBmb3IgQkMNCmxpYnJhcnkoYWdybXQpICNmb3IgYWdyZWVtZW50IGFuZCBwb2xhcml6YXRpb24gY2FsY3VsYXRpb24NCmxpYnJhcnkodmlzZGF0KSAjdmlzdWFsaXplIGRhdGFmcmFtZXMgaW4gcGxvdHMNCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjZWFzeSB0byB1c2UgY29sb3IgcGFsZXR0ZXMNCmxpYnJhcnkocm1hcmtkb3duKSAjZm9yIHRoZSBwYWdlZF90YWJsZSBmdW5jdGlvbg0KbGlicmFyeShkb1BhcmFsbGVsKSAjcGFyYWxsZWwgY29tcHV0YXRpb24gdXNpbmcgbXVsdGlwbGUgY29yZXMNCmxpYnJhcnkoZm9yZWFjaCkgIyBmb3IgZWFjaCBmdW5jdGlvbiwgc28gdGhlIHNpbXVsYXRpb24gZG9lcyBub3QgdGFrZSBhZ2VzDQoNCiNmb3IgdGhvc2Ugb2YgeW91IHRyeWluZyB0byBjaGFuZ2UgdGhlIHRocmVzaG9sZHMsIHBsZWFzZSBkbyBpdCBoZXJlOg0KQkNfdGhyZXNob2xkIDwtIDUvOQ0KcG9sYXJpemF0aW9uX3RocmVzaG9sZCA8LSAuNQ0KZ3JvdXBfZGl2ZXJnZW5jZV90aHJlc2hvbGQgPC0gLjUNCg0KDQoNCg0KY29sb3JzIDwtIGJyZXdlci5wYWwoNCwgIkRhcmsyIikNCg0Kbl9zY2FsZV9vbl9saWtlcnQgPC0gYygxOjExKQ0KbWluX2xpa2VydCA8LSBtaW4obl9zY2FsZV9vbl9saWtlcnQpDQptYXhfbGlrZXJ0IDwtIG1heChuX3NjYWxlX29uX2xpa2VydCkNCg0Kc2FtcGxlX3NlcXVlbmNlIDwtIGMoc2VxKDEwLDIwMCxieSA9MTApKQ0Kc2FtcGxlZCA8LSBkYXRhLmZyYW1lKE5fcGFydCA9IHNhbXBsZV9zZXF1ZW5jZSkNCg0KcmVwbGljYXRpb25zX3Blcl9zZXR0aW5nIDwtIDIwMA0KDQpuX3BvcHVsYXRpb24gPC0gMTBeNA0KcHJvcF9taW5vcml0eSA8LSAuMDUNCg0KI3NldCBzZWVkIHNvIGV2ZXJ5IHJhbmRvbSB0aGluZyBoZXJlIGlzIHJlcHJvZHVjaWJsZQ0Kc2V0LnNlZWQoNDIpDQoNCiNzZXQgZWNobyA9IEZBTFNFIChlLmcuIGRvbnQgc2hvdyBjb2RlIGluIG91dHB1dCkgZm9yIGFsbCBjaHVua3MsIGV4Y2VwdCB3aGVuIGV4cGxpY2l0bHkgdGVsbGluZyBvdGhlcndpc2UNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgIGVjaG8gPSBGQUxTRSwNCiAgIHdhcm5pbmcgPSBUUlVFLA0KICAgbWVzc2FnZSA9IFRSVUUNCiAgICkNCmBgYA0KIyBIb3cgTWFueSBSYXRpbmdzIEFyZSBOZWVkZWQ/DQoNCiMjIEludHJvZHVjdGlvbg0KDQpUaGlzIHdvcmsgYnVpbGRzIG9uIG15IFtmaXJzdCAoYW5kIGZhaWxlZCkgYXR0ZW1wdF0oUmlzay1Qb2xhcml6YXRpb24tU2ltdWxhdGlvbi5odG1sKSB0byBlc3RpbWF0ZSBob3cgbWFueSByYXRpbmdzIG9uZSBuZWVkcyB0byBzYW1wbGUgZm9yIG9idGFpbmluZyBhIGRlcGVuZGFibGUgbWVhc3VyZSBvZiBhIGNlcnRhaW4gcG9wdWxhdGlvbi4gVGhlcmVmb3JlLCByZWFkZXJzIGFyZSBhZHZpc2VkIHRvIGNhdGNoIHVwIG9uIG15IHByZXZpb3VzIHdvcmsgdG8gYmUgdXAgdG8gc3BlZWQgb24gdGhpcyBzbWFsbGVyIHByb2plY3QuICANCg0KQXMgdGhlIHVuY29udmVudGlvbmFsIGFwcHJvYWNoIGRpZCBub3QgeWllbGQgdGhlIGRlc2lyZWQgcmVzdWx0cywgd2Ugd2lsbCByZXZlcnQgYmFjayB0byB0aGUgbW9yZSAib2xkIHNjaG9vbCIgbWV0aG9kb2xvZ2llcyBvZiBhbiBhIHByaW9yaSBwb3dlciBhbmFseXNpcy4gVGhhdCBpcywgZXN0aW1hdGluZyB0aGUgbWluaW11bSBzYW1wbGUgc2l6ZSBuZWVkZWQgdG8gdW5jb3ZlciBhIHNldCBlZmZlY3Qgc2l6ZSAob3IgbGFyZ2VyKSwgZ2l2ZW4gYSBzaWduaWZpY2FuY2UgbGV2ZWwgYW5kIHR5cGUgSUkgKGZhbHNlIG5lZ2F0aXZlcykgZXJyb3IuICANCg0KVGhvdWdoIGluIGxpZ2h0IG9mIHN1Y2ggYW4gZW5kZWF2b3IsIHdlIGhhdmUgdHdvIHByb2JsZW1zOiAgDQoNCi0gU2V0dGluZyBhIChudW1lcmljYWwpIGVmZmVjdCBzaXplIGRlcGVuZHMgb24gdGhlIHBvbGFyaXphdGlvbiBtZWFzdXJlIGl0c2VsZiwgYW5kIGluIGhvdyB3ZSBkZWZpbmUgcG9sYXJpemF0aW9uIGluIHRoZSBmaXJzdCBwbGFjZS4gIA0KLSBXZSBkbyBub3QgaGF2ZSBhbiBhY3R1YWwgc2lnbmlmaWNhbmNlIHRlc3QgZm9yIHBvbGFyaXphdGlvbiwgaGVuY2Ugd2UgY2FuIG5vdCBkZWZpbmUgd2hlbiBhIGRpc3RyaWJ1dGlvbiBpcyBwb2xhcml6ZWQgb3Igbm90LiAgDQoNClRvIHNvbHZlIHRoZXNlIHByb2JsZW1zLCB0aGUgZm9sbG93aW5nIHByb3Bvc2FscyB3ZXJlIHRha2VuIGZvciB0aGlzIHdvcms6ICANCg0KLSA0IHByZXNldCBkaXN0cmlidXRpb25zIHdlcmUgY2hvc2VuLCBlYWNoIHdpdGggZGlmZmVyaW5nIGdyYWRlIG9mIHBvbGFyaXphdGlvbiAoYW5kIGhlbmNlIGRpZmZlcmVudCBlZmZlY3Qgc2l6ZSksIGFuZCB3aWxsIHNlcnZlIGFzIHByb3hpZXMgZm9yIG91ciBhc3N1bWVkIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9ucyBmb3IgNCBkaWZmZXJlbnQgcmlza3MuICANCi0gRm9yIHRoZSByZXBsYWNlbWVudCBvZiBhIHBvbGFyaXphdGlvbiB0ZXN0LCB3ZSBjYWxjdWxhdGUgdGhlIG1lYXN1cmVzIG9mIGJpbW9kYWxpdHkgY29lZmZpY2llbnQgKEJDKSwgcG9sYXJpemF0aW9uIGFuZCBncm91cCBkaXZlcmdlbmNlLiBUaGVzZSBtZWFzdXJlcyB3ZXJlIGNob3NlbiBmcm9tIHRoZSBwcmlvciBzaW11bGF0aW9uIHdvcmssIGFzIHRoZXkgc2VlbWVkIGxpa2UgZ29vZCBtZWFzdXJlcyBvZiBwb2xhcml6YXRpb24uIFdlIHdpbGwgdGhlbiBwcm9jZWVkIGluIGNhdGVnb3JpemluZyBhIGRpc3RyaWJ1dGlvbiBhcyAicG9sYXJpemVkIiB3aGVuIHZhbHVlcyByZWFjaCBhIHByZXNldCB0aHJlc2hvbGQsIGFuZCAibm90IHBvbGFyaXplZCIgaWYgdGhlIHZhbHVlIGZhbGxzIGJlbG93IHRoZSB0aHJlc2hvbGQuICANCg0KDQojIE1ldGhvZA0KDQojIyBQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbnMNCldoaWxlIG1vc3Qgb2YgdGhlIHByZXZpb3VzIGRpc3RyaWJ1dGlvbnMgd2VyZSB1c2VkIGFnYWluICh3aXRoIHRoZSBzYW1lIGNvbG9yIGFzIGxhc3QgdGltZSkgc29tZSBhZGp1c3RtZW50cyB3ZXJlIG1hZGUuIE5vdGFibHksIHdlJ3ZlIHRyYW5zaXRpb25lZCB0byBhIDExIC1wb2ludCBsaWtlcnQgc2NhbGUsIHdoaWNoIG91ciBncm91cCBoYXMgY2hvc2VuIHRvIHVzZSBmb3IgdGhlIHVwY29taW5nIHN0dWR5LiBIZXJlIGFyZSB0aGUgZGlzdHJpYnV0aW9ucyB3aXRoIHNvbWUgY29tbWVudHM6ICANCg0KLSBbKipOb25lKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzFdYDsifSAoYSBub3JtYWwgRGlzdHJpYnV0aW9uLCBidXQgdGhpcyB0aW1lIHdpdGggYSBzaGlmdGVkIG1lYW4gaW5zdGVhZCBvZiB0aGUgbWlkcG9pbnQpLCByZXByZXNlbnRpbmcgYSByaXNrIHdoZXJlIGEgY29uc2Vuc3VzIGlzIGVzdGFibGlzaGVkLiAgICANCi0gWyoqU21hbGwgcG9sYXJpemF0aW9uKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzJdYDsifSAodGhlIHNrZXdlZCBiZXRhIGRpc3RyaWJ1dGlvbiBmcm9tIHByaW9yIHdvcmsgd2FzIHJlcGxhY2VkIHdpdGggdGhpcyBvbmUsIHJlcHJlc2VudGluZyBhIHNtYWxsZXIgcG9sYXJpemF0aW9uIGluIHRoZSBwb3B1bGF0aW9uKSAgDQotIFsqKlJhcmUqKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbM11gOyJ9IChhIG1ham9yaXR5IHJhdGluZyBvbiBvbmUgZXh0cmVtZSwgd2hpbGUgYSBtaW5vcml0eSBncm91cCB3aXRoIGJhc2UgcmF0ZSBvZiBgYHIgcHJvcF9taW5vcml0eSAqMTAwYGAlIG9uIHRoZSBvdGhlciBleHRyZW1lKSAgDQotIFsqKlN0cm9uZyBwb2xhcml6YXRpb24qKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbNF1gOyJ9IChzdGlsbCB0aGUgc3ltbWV0cmljYWwgdmVyc2lvbiwgYnV0IHRoaXMgdGltZSBpbiBkaXNjcmV0ZSBzaGFwZSkgIA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHdoaWxlIHRoZSBub3JtYWwgYW5kIHN0cm9uZyBwb2xhcml6YXRpb24gZGlzdHJpYnV0aW9uIHJlcHJlc2VudCBubyBhbmQgc3Ryb25nIGVmZmVjdHMsIHRoZSBzbWFsbCBhbmQgcmFyZSBkaXN0cmlidXRpb25zIHNob3VsZCBib3RoIGlsbHVzdHJhdGUgc21hbGwgZWZmZWN0cyBpbiB0aGUgcG9wdWxhdGlvbiwgYW5kIHB1dHRpbmcgb25lIG92ZXIgdGhlIG90aGVyIHJlYWxseSBkZXBlbmRzIG9uIGhvdyB0byBpbnRlcnByZXQvIG9wZXJhdGlvbmFsaXplIHBvbGFyaXphdGlvbiBpdHNlbGYgKGUuZy4gYXN5bW1ldHJ5LCBkaXN0YW5jZSwgYWdyZWVtZW50IGV0Yy4uLikuICANCg0KYGBge3IgR2VuZXJhdGlvbiBvZiBQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbn0NCg0Kbm9ybWFsIDwtIHJvdW5kKHJub3JtKG5fcG9wdWxhdGlvbiwgbWVhbiA9IDgsc2QgPSAxLjIpKQ0Kbm9ybWFsIDwtIHBtaW4ocG1heChub3JtYWwsIG1pbl9saWtlcnQpLCBtYXhfbGlrZXJ0KQ0KDQpzdHJvbmdfcG9sIDwtIHJvdW5kKHJiZXRhKG5fcG9wdWxhdGlvbiwgc2hhcGUxID0gLjEsIHNoYXBlMiA9IC4xKSoxMCkgKzENCnN0cm9uZ19wb2wgPC0gcG1pbihwbWF4KHN0cm9uZ19wb2wsIG1pbl9saWtlcnQpLCBtYXhfbGlrZXJ0KQ0KDQpyYXJlIDwtIGMocm91bmQocm5vcm0obl9wb3B1bGF0aW9uICooMS0gcHJvcF9taW5vcml0eSksIG1lYW4gPSAyLHNkID0gMS4zKSksIA0KICAgICAgICAgICByb3VuZChybm9ybShuX3BvcHVsYXRpb24gKnByb3BfbWlub3JpdHksIG1lYW4gPSAxMSxzZCA9IC41KSkpDQpyYXJlIDwtIHBtaW4ocG1heChyYXJlLCBtaW5fbGlrZXJ0KSwgbWF4X2xpa2VydCkNCg0Kc21hbGxfcG9sIDwtIGMocm91bmQocm5vcm0obl9wb3B1bGF0aW9uICouNjUsIG1lYW4gPSA1LHNkID0gLjkpKSwgDQogICAgICAgICAgIHJvdW5kKHJub3JtKG5fcG9wdWxhdGlvbiAqIC4zNSwgbWVhbiA9IDEwLHNkID0gLjUpKSkNCnNtYWxsX3BvbCA8LSBwbWluKHBtYXgoc21hbGxfcG9sLCBtaW5fbGlrZXJ0KSwgbWF4X2xpa2VydCkNCg0KDQpQb3BfZGYgPC0gZGF0YS5mcmFtZShgTm9ybWFsIERpc3RyaWJ1dGlvbmA9IG5vcm1hbCwNCiAgICAgICAgICAgICAgICAgICAgIGBTbWFsbCBQb2xhcml6YXRpb25gID0gc21hbGxfcG9sLA0KICAgICAgICAgICAgICAgICAgICAgYFJhcmUgUG9sYXJpemF0aW9uYCA9IHJhcmUsDQogICAgICAgICAgICAgICAgICAgICBgU3Ryb25nIFBvbGFyaXphdGlvbmAgPSBzdHJvbmdfcG9sKQ0KDQpuYW1lcyhQb3BfZGYpIDwtIGMoIk5vbmUiLCAiU21hbGwgUG9sLiIsICJSYXJlIiwgIlN0cm9uZyBQb2wuIikNCg0KDQoNClBvcF9kZl9wbG90IDwtIFBvcF9kZiAlPiUgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgdmFsdWVzX3RvID0gIlJhdGluZyIsIG5hbWVzX3RvID0gIkRpc3RyIikgJT4lIA0KICAgbXV0YXRlKERpc3RyID0gZmFjdG9yKERpc3RyLCBsZXZlbHMgPSBjKCJOb25lIiwgIlNtYWxsIFBvbC4iLCJSYXJlIiwgIlN0cm9uZyBQb2wuIikpKQ0KDQpQb3BfZGZfcGxvdCAlPiUgZ2dwbG90KGFlcyhSYXRpbmcsIGZpbGwgPSBEaXN0cikpKw0KICAgZ2VvbV9iYXIod2lkdGg9IC43NSkrDQogICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKERpc3RyKSkrDQogICBzY2FsZV94X2NvbnRpbnVvdXMobi5icmVha3MgPSAxMSwgZXhwYW5kID0gYygwLDApKSsNCiAgIHRoZW1lX21pbmltYWwoKSsNCiAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEsIDIsIDAsIDApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICBnZW9tX3RleHQoYWVzKHg9Nix5ID0gMzUwMCwgbGFiZWw9IERpc3RyLCBjb2xvciA9IERpc3RyKSwgc2l6ZSA9IDYuOCkrDQogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpKw0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykrDQogICB5bGFiKCJDb3VudCIpDQpgYGANCiAgDQojIyBQcm9jZWR1cmUNCg0KRm9yIHRoaXMgd29yaywgd2Ugd2lsbCB1c2UgZGlmZmVyZW50IHNhbXBsZSBzaXplcyBjb25zaXN0aW5nIG9mIGBgciBucm93KHNhbXBsZWQpYGAgZGlmZmVyZW50IHNpemVzOiAgDQpgYGB7ciBTaG93IHNhbXBsZSBzZXF1ZW5jZX0NCnNhbXBsZV9zZXF1ZW5jZQ0KYGBgDQoNCkZvciBlYWNoIHNhbXBsZSBzaXplLCB3ZSByZXBsaWNhdGUgdGhlIHJhbmRvbSBkcmF3IGBgciByZXBsaWNhdGlvbnNfcGVyX3NldHRpbmdgYCB0aW1lcy4gDQoNCkFzIG1lbnRpb25lZCBpbiB0aGUgaW50cm9kdWN0aW9uLCB3ZSB3aWxsIHVzZSB0aHJlc2hvbGRzIGZvciBlYWNoIHBvbGFyaXphdGlvbiBtZWFzdXJlIHRvIGRldGVybWluZSB3aGV0aGVyIHBvbGFyaXphdGlvbiBpcyBwcmVzZW50IG9yIG5vdC4gTHVja2lseSwgdGhlIEJDIGFscmVhZHkgaGFzIGEgc2V0IHRocmVzaG9sZCBvZiAkMC5cb3ZlcmxpbmV7NX0kLiANCg0KRm9yIHRoZSB0d28gb3RoZXIgbWVhc3VyZXMsIHByZXZpb3VzIHJlc3VsdHMgd2VyZSBjb25zdWx0ZWQuIFJlYWxpemF0aW9uIHRoYXQgdGhlIG1lYXN1cmVtZW50IG9mIHBvbGFyaXphdGlvbiBoYXMgYSBsb3cgdmFsdWUgZm9yIHRoZSByYXJlIGRpc3RyaWJ1dGlvbiAoZXZlbiBsb3dlciB0aGFuIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLCBhcyBpdCB1c2VzIGEgd2VpZ2h0ZWQgc3VtLCB0aHVzIHNtYWxsIGdyb3VwcyBhcmUgZGlzY291bnRlZCksIGxlYWRzIHRvIGEgY3J1Y2lhbCBpbXBsaWNhdGlvbi4gU2V0dGluZyBhIGxvdyB0aHJlc2hvbGQgZm9yIHJhcmUgZGlzdHJpYnV0aW9ucyBpbiBvcmRlciB0byBpZGVudGlmeSB0aGVtIGFzIHBvbGFyaXplZCB3aWxsIGFsc28gbmV0IHVzIHRvbyBtYW55IGZhbHNlIG5lZ2F0aXZlcyAoZS5nLiBzYXlpbmcgbm9ybWFsIGRpc3RyaWJ1dGlvbnMgYXJlIHBvbGFyaXplZCkuIFRvIG5vdGUsIGdyb3VwIGRpdmVyZ2VuY2UgdmFsdWVzIGluIHRoZSBwcmV2aW91cyBzaW11bGF0aW9uIHJhbmdlZCBmcm9tIC4yNCBhbmQgLjksIHdoaWxlIHRoZSBtZWFzdXJlIG9mIHBvbGFyaXphdGlvbiByYW5nZWQgZnJvbSAuMSB0byAuOC4gSGVuY2UgdGhlIHRocmVzaG9sZCBmb3IgZ3JvdXAgZGl2ZXJnZW5jZSBhbmQgcG9sYXJpemF0aW9uIHdlcmUgKGFyYml0cmFyaWx5KSBzZXQgYXQgYGByIGdyb3VwX2RpdmVyZ2VuY2VfdGhyZXNob2xkYGAgYW5kIGBgciBwb2xhcml6YXRpb25fdGhyZXNob2xkYGAgcmVzcGVjdGl2ZWx5LiAgICANCg0KVG8gc3VtbWFyaXplLCA0IGRpZmZlcmVudCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiB3ZXJlIGNyZWF0ZWQgYW5kIHNlcnZlIGFzIG91ciBlZmZlY3Qgc2l6ZXMsIHRoZSB0aHJlc2hvbGRzIGZ1bmN0aW9ucyBhcyBhIHByb3h5IGZvciB3aGVuIHdlIGFjdHVhbGx5IHJlamVjdCBvciBhY2NlcHQgdGhhdCB0aGUgc2FtcGxlZCBkaXN0cmlidXRpb24gaXMgcG9sYXJpemVkIChzaW1pbGFyIHRvIHRoZSBhbHBoYSB2YWx1ZSBhbmQgcC12YWx1ZXMpLCBhbmQgdGh1cyB3ZSB1c2UgZGlmZmVyZW50IGVmZmVjdCBzaXplcyB0byBlc3RpbWF0ZSB0aGUgcG93ZXIuDQoNCmBgYHtyIFNhbXBsaW5nfQ0KbWF4X2NvbHMgPC0gbWF4KHNhbXBsZWQpICAgDQoNCiMgUmVnaXN0ZXIgcGFyYWxsZWwgYmFja2VuZCB3aXRoIHRoZSBkZXNpcmVkIG51bWJlciBvZiBjb3Jlcw0KbnVtX2NvcmVzIDwtIGRldGVjdENvcmVzKCktMQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcihudW1fY29yZXMpDQpyZWdpc3RlckRvUGFyYWxsZWwoY2wpDQoNCiNyb3RhdGUgUG9wX2RmLCBzbyBvdXIgZnVuY3Rpb24gd29ya3MgKGVhY2ggcm93IG5lZWRzIHRvIGJlIGEgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbiwgaW5zdGVhZCBvZiBlYWNoIGNvbCkNCnJvdF9Qb3BfZGYgPC0gYXMuZGF0YS5mcmFtZSh0KFBvcF9kZikpDQoNCiMgRGVmaW5lIGZ1bmN0aW9uIHRvIHByb2Nlc3MgZWFjaCBjb21iaW5hdGlvbiBvZiByaXNrX2Rpc3RyaWJ1dGlvbiwgc2FtcGxlc2l6ZSBhbmQgcmVwbGljYXRpb25zIHBlciBzZXR0aW5nDQpzYW1wbGVfYW5kX3JlcGxpY2F0ZV9mb3JfYWxsX3Jpc2tzIDwtIGZ1bmN0aW9uKGkpIHsNCiAgc2FtcGxlZF9tYXRyaXhfbGlzdCA8LSBsaXN0KCkNCiAgDQogIGZvciAoaiBpbiAxOm5yb3cocm90X1BvcF9kZikpIHsNCiAgICBtYXQgPC0gcmVwbGljYXRlKHJlcGxpY2F0aW9uc19wZXJfc2V0dGluZywNCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSgxOm5fcG9wdWxhdGlvbiwgc2l6ZSA9IHNhbXBsZWRbaSwgMV0sIHJlcGxhY2UgPSBUUlVFKSkgI2NyZWF0ZSBtYXRyaXggb2Ygb3VyIHNhbXBsZXMgd2l0aCByZXBsYWNpbmcsIHRpbWVzIG4gLSByZXBsaWNhdGlvbnMNCiAgICANCiAgICBzYW1wbGVkX3RhYmxlIDwtIHJvdF9Qb3BfZGZbaiwgbWF0XSAjdXNpbmcgdGhlIG1hdHJpeCwgY29sbGVjdCB0aGUgdmFsdWVzIGZyb20gb3VyIHJpc2sgZGlzdHJpYnV0aW9uIG1hdHJpeCAoYXMgYSB2ZWN0b3IgdGhvdWdoLi4uKQ0KICAgIHNhbXBsZWRfbWF0cml4IDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KHNhbXBsZWRfdGFibGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IHJlcGxpY2F0aW9uc19wZXJfc2V0dGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gc2FtcGxlZFtpLCAxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXJvdyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBOVUxMKSkgI2NyZWF0ZSBkZiBvdXQgb2YgdGhlc2UgdmVjdG9ycyBpbnN0ZWFkIG9mIGZsYXQgdmVjdG9ycw0KICAgIA0KICAgIA0KICAgIGlmIChuY29sKHNhbXBsZWRfbWF0cml4KSA8IG1heF9jb2xzKSB7DQogICAgICBwYWRkaW5nX21hdHJpeCA8LSBtYXRyaXgoTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IG5yb3coc2FtcGxlZF9tYXRyaXgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSBtYXhfY29scyAtIG5jb2woc2FtcGxlZF9tYXRyaXgpKQ0KICAgICAgc2FtcGxlZF9tYXRyaXggPC0gY2JpbmQoc2FtcGxlZF9tYXRyaXgsIHBhZGRpbmdfbWF0cml4KQ0KICAgIH0gI2lmIG1hdHJpeCBpcyBub3Qgd2lkZSBlbm91Z2ggZm9yIG91ciBlbmQgcmVzdWx0IG1hdHJpeCwgcGFkZCBpdCB3aXRoIE5BIGNvbHVtbnMsIHNvIGJpbmRpbmcgcm93cyBpcyBkb2FibGUgKG5lZWRzIHNhbWUgYW1vdW50IG9mIG5jb2xzKQ0KICAgIA0KICAgIHNhbXBsZWRfbWF0cml4IDwtIGNiaW5kKG1hdHJpeChzYW1wbGVkW2ksMV0sIG5yb3cgPSByZXBsaWNhdGlvbnNfcGVyX3NldHRpbmcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgoaiwgbnJvdyA9IHJlcGxpY2F0aW9uc19wZXJfc2V0dGluZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZF9tYXRyaXgpICNiaW5kIGNvbHVtbnMgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2FtcGxlIHNpemUgYW5kIHdoaWNoIHJpc2tfZGlzdHJpYnV0aW9uIHdhcyBzYW1wbGVkDQogICAgDQogICAgY29sbmFtZXMoc2FtcGxlZF9tYXRyaXgpIDwtIGMoInNhbXBsZV9zaXplIiwgInJpc2tfZGlzdHJpYnV0aW9uIiwgcGFzdGUwKCJyYXRpbmdfIiwgMTptYXhfY29scykpICNyZXdyaXRlIGNvbG5hbWVzIHNvIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgYmlnaCBtYXRyaXgNCiAgICBzYW1wbGVkX21hdHJpeF9saXN0W1tqXV0gPC0gc2FtcGxlZF9tYXRyaXggI3N0b3JlIGluIGxpc3QNCiAgfQ0KICByZXR1cm4oZG8uY2FsbChyYmluZCwgc2FtcGxlZF9tYXRyaXhfbGlzdCkpICNhZnRlciBhbGwgcmlzayBkaXN0cmlidXRpb25zIGFyZSBzYW1wbGVkIGZyb20sIGJpbmQgdGhlbSBhbGwgYW5kIHJldHVybiB0aGUgb3V0cHV0DQogIA0KfQ0KDQojIFBlcmZvcm0gcGFyYWxsZWwgcHJvY2Vzc2luZyB1c2luZyBmb3JlYWNoLCBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZGlmZmVyZW50IHNhbXBsZXNpemVzDQpyZXN1bHQgPC0gZm9yZWFjaChpID0gMTpucm93KHNhbXBsZWQpLCAuY29tYmluZSA9IHJiaW5kKSAlZG9wYXIlIHsNCiAgc2FtcGxlX2FuZF9yZXBsaWNhdGVfZm9yX2FsbF9yaXNrcyhpKQ0KfQ0KDQojIFN0b3AgdGhlIHBhcmFsbGVsIGJhY2tlbmQNCnN0b3BDbHVzdGVyKGNsKQ0KDQpyZXN1bHQgPC0gbXV0YXRlX2FsbChyZXN1bHQsIGFzLm51bWVyaWMgKQ0KDQoNCnZpc19taXNzKHJlc3VsdFssc2VxKGZyb20gPTMsIHRvID0gbmNvbChyZXN1bHQpLCBsZW5ndGgub3V0ID0gNDApXSwgc2hvd19wZXJjX2NvbCA9IEYpDQpgYGAgIA0KICANCkFnYWluLCB0aGlzIGlzIGhvdyBvdXIgc2FtcGxlZCBtYXRyaXggbG9va3MgbGlrZSwgYWRvcHRpbmcgYSBzdGFpcmNhc2UgbGlrZSBzaGFwZS4gVXNpbmcgdGhpcyBtZXRob2Qgc2F2ZXMgdXMgdGltZSwgYXMgd2VsbCBhcyBwcmV2ZW50cyBlcnJvcnMuICANCg0KYGBge3IgQ2FsY3VsYXRpbmcgUG9sYXJpc2F0aW9uIE1lYXN1cmVzfQ0KI3Rha2VuIGZyb20gbXkgcHJldmlvdXMgd29yaw0KY2FsY19ncm91cF9kaXZlcmdlbmNlIDwtIGZ1bmN0aW9uKHZlYywgbWlkcG9pbnQgPSA2LCBzY2FsZV9yYW5nZSA9IDExKXsNCiAgIA0KICAgWF9oaWdoIDwtIG1lYW4odmVjW3ZlYyA+PSBtaWRwb2ludF0sIG5hLnJtID0gVFJVRSkNCiAgIGlmKHN1bSh2ZWNbdmVjID49IG1pZHBvaW50XSwgbmEucm0gPVQgKSA9PSAwKXsNCiAgICAgIFhfaGlnaCA8LSAwDQogICB9DQogICANCiAgIFhfbG93IDwtICBtZWFuKHZlY1t2ZWMgPCBtaWRwb2ludF0sIG5hLnJtID0gVFJVRSkNCiAgIGlmKHN1bSh2ZWNbdmVjIDwgbWlkcG9pbnRdLCBuYS5ybSA9VCApID09IDApew0KICAgICAgWF9sb3cgPC0gMA0KICAgfQ0KICAgcmV0dXJuKChhYnMoWF9oaWdoIC0gWF9sb3cpLyBzY2FsZV9yYW5nZSkpDQp9DQoNCg0KY2FsY19iaW1vZGFsaXR5X2NvZWZmaWNpZW50IDwtIGZ1bmN0aW9uKHZlYyl7DQogICBza2V3IDwtIHNrZXcodmVjLCBuYS5ybSA9IFRSVUUsIHR5cGUgPSAzKQ0KICAga3VydG9zaXMgPC0ga3VydG9zaSh2ZWMsIG5hLnJtID0gVFJVRSwgdHlwZSA9IDMpDQogICBuIDwtIHN1bSghaXMubmEodmVjKSkNCiAgIHJldHVybigoc2tld14yKzEpIC8gKGt1cnRvc2lzICsgKCgzKigobi0xKSleMikvKChuLTIpKihuLTMpKSkgKSkNCn0NCg0KIyBDcmVhdGVkIHRoaXMgb25lICJmcm9tIHNjcmF0Y2giLCBhcyB3ZSB3b3JrIHdpdGggYSBzbWFsbGVyIHNjYWxlIG9mIDExIGluc3RlYWQgb2YgMTAxLCB0aGUgY2FsY3VsYXRpb24gb2YgcG9sYXJpemF0aW9uIGRvZXMgbm90IHRha2UgdG9vIGxvbmcgYW55bW9yZQ0KDQpjYWxjX3BvbGFyaXphdGlvbiA8LSBmdW5jdGlvbih2ZWMpew0KICAgdmVjMiA8LSBhcy52ZWN0b3IodmVjKQ0KICAgZnJlcV92ZWMgPC0gYWdybXQ6OmNvbGxhcHNlKHZlYzIsIHBvcyA9IGMoMToxMSkpDQogICByZXR1cm4oYWdybXQ6OnBvbGFyaXphdGlvbihmcmVxX3ZlYykpDQp9DQoNCiMgdGhpcyBjb2RlIGlzIGNvbW1lbnRlZCwgYXMgdGhlIGNvbXB1dGF0aW9uIHRha2VzIHRvbyBsb25nLCBhbmQgSSBoYXRlIHdhaXRpbmcgd2hpbGUga25pdGluZy4gSSBoYXZlIHNhdmVkIGEgc2VwcGFyYXRlIHJkcyBmaWxlLCB3aGljaCB3aWxsIGJlIHJlYWQgaW4gaW5zdGVhZC4gUmVhZGVycyB3aG8gd2FudCB0byB1bmNvbW1lbnQgc2VjdGlvbiwgc2VsZWN0IHRoZSBsaW5lcyB0byB1bmNvbW1lbnQgYW5kIHByZXNzIEN0cmwgKyBTaGlmdCArIEMgKG9uIFdpbmRvd3MvTGludXgpIG9yIENtZCArIFNoaWZ0ICsgQyAob24gbWFjT1MpDQoNCiMgI2FwcGx5IHRoZSBmdW5jdGlvbnMgdG8gb3VyIHJlc3VsdCBtYXRyaXgsIHRoZXJlZm9yZSBjYWxjdWxhdGUgZm9yIGVhY2ggZHJhd24gc2FtcGxlIHRoZSBwb2xhcml6YXRpb24gbWV0cmljcw0KIyBCQ19yZXN1bHQgPC0gYXBwbHkocmVzdWx0WywtYygxOjIpXSwgMSwgY2FsY19iaW1vZGFsaXR5X2NvZWZmaWNpZW50KQ0KIyBzdW0oaXMubmEoQkNfcmVzdWx0KSkNCiMgDQojIGdyb3VwX2RpdmVyZ2VuY2VfcmVzdWx0IDwtIGFwcGx5KHJlc3VsdFssLWMoMToyKV0sIDEsIGNhbGNfZ3JvdXBfZGl2ZXJnZW5jZSkNCiMgc3VtKGlzLm5hKGdyb3VwX2RpdmVyZ2VuY2VfcmVzdWx0KSkNCiMgDQojICMgUmVnaXN0ZXIgcGFyYWxsZWwgYmFja2VuZCB3aXRoIHRoZSBkZXNpcmVkIG51bWJlciBvZiBjb3Jlcw0KIyBudW1fY29yZXMgPC0gZGV0ZWN0Q29yZXMoKS0xDQojIA0KIyBjbCA8LSBtYWtlQ2x1c3RlcihudW1fY29yZXMpDQojIHJlZ2lzdGVyRG9QYXJhbGxlbChjbCkNCiMgDQojICMgUGVyZm9ybSBwYXJhbGxlbCBwcm9jZXNzaW5nIHVzaW5nIGZvcmVhY2gsIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBkaWZmZXJlbnQgZHJhd24gc2FtcGxlcw0KIyBwb2xhcml6YXRpb25fcmVzdWx0IDwtIGZvcmVhY2goaSA9IDE6bnJvdyhyZXN1bHQpLCAuY29tYmluZSA9IHJiaW5kKSAlZG9wYXIlIHsNCiMgICBjYWxjX3BvbGFyaXphdGlvbihyZXN1bHRbaSwgLWMoMToyKV0pDQojIH0NCiMgc3VtKGlzLm5hKHBvbGFyaXphdGlvbl9yZXN1bHQpKQ0KIyANCiMgIyBTdG9wIHRoZSBwYXJhbGxlbCBiYWNrZW5kDQojIHN0b3BDbHVzdGVyKGNsKQ0KIyANCiMgDQojIGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlcyA8LSBjYmluZChwb2xhcml6YXRpb25fcmVzdWx0LA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfZGl2ZXJnZW5jZV9yZXN1bHQsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ19yZXN1bHQsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbLDE6Ml0NCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiMgc3VtKGlzLm5hKGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlcykpDQojIA0KIyBzYXZlUkRTKGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlcywgInNhdmVkX1JEU1xcY29tYmluZWRfcmVzdWx0X21lYXN1cmVzX3Bvd2VyX2FuYWx5c2lzLnJkcyIpDQoNCmNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlcyA8LSByZWFkUkRTKCJzYXZlZF9SRFNcXGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlc19wb3dlcl9hbmFseXNpcy5yZHMiKQ0KDQp2aXNfbWlzcyhjb21iaW5lZF9yZXN1bHRfbWVhc3VyZXMsIHNvcnRfbWlzcyA9IEYpDQpgYGANCiAgDQpBZnRlciB3ZSd2ZSBjYWxjdWxhdGVkIHRoZSBwb2xhcml6YXRpb24gbWVhc3VyZXMgZm9yIGVhY2ggb2YgdGhlIGBgciBucm93KHJlc3VsdClgYCBkcmF3biBzYW1wbGVzLCB0aGUgbWVhc3VyZXMgd2VyZSBwdXQgaW50byBhIGRhdGEgZnJhbWUuIEFzIHdlIGNhbiBzZWUsIG5vIG1pc3NpbmcgdmFsdWVzIGFyZSBoZXJlLCBpbmRpY2F0aW5nIHRoYXQgZWFjaCBtZWFzdXJlIHdhcyBjYWxjdWxhdGVkIHN1Y2Nlc3NmdWxseS4gIA0KDQojIyBFeHBlY3RhdGlvbnMNCg0KSXQgaXMgZXhwZWN0ZWQgdGhhdCB3aXRoIGdyZWF0ZXIgc2FtcGxlIHNpemUsIHdlIHdvdWxkIGhhdmUgYSBtb3JlIGFjY3VyYXRlIGFuZCByZWxpYWJsZSBlc3RpbWF0ZSBvZiB0aGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIFRob3VnaCBpZiB0aGUgbWVhc3VyZXMgb2YgcG9sYXJpemF0aW9uIGluIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbnMgd2VyZSBsb3dlciB0aGFuIG91ciBzZXQgdGhyZXNob2xkcywgdGhlbiBzYWlkIG1lYXN1cmVzIHdpbGwgbmV2ZXIgaW5kaWNhdGUgcG9sYXJpemF0aW9uIChleGNlcHQgZHVlIHRvIHJhbmRvbSBub2lzZSkuIFRvIGlsbHVzdHJhdGUgZXhwZWN0ZWQgcGl0ZmFsbHMgb2YgdGhlIGN1cnJlbnQgYXBwcm9hY2gsIGhlcmUgaXMgYSBmaXR0aW5nIGFuYWxvZ3ksIHdoZXJlIHRoZSBwb2xhcml6YXRpb24gbWVhc3VyZXMgZnVuY3Rpb25zIGFzIHByZWRpY3Rpb24gbW9kZWxzIGluIGNsYXNzaWZpY2F0aW9uIHByb2JsZW1zOiAgDQoNCi0gR29vZCBtb2RlbHMgd2l0aCBoaWdoIGFjY3VyYWN5IGNhbiBmaW5kIHBvbGFyaXphdGlvbiBpbiBjYXNlIGl0IGlzIHBvbGFyaXplZCAoc2Vuc2l0aXZpdHkpLCBhbmQgZGlmZmVyZW50aWF0ZXMgZGlzdHJpYnV0aW9ucyBhcyBub3QgcG9sYXJpemVkIGluIGNhc2UgaXQgaXMgbm90IHBvbGFyaXplZCAoc3BlY2lmaWNpdHkpLiAgDQoNCi0gSWYgdGhlIG1lYXN1cmUgZGlmZmVyZW50aWF0ZXMgdGhlIGRpc3RyaWJ1dGlvbiB3aXRoIFsqKm5vIHBvbGFyaXphdGlvbioqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1sxXWA7In0gYW5kIFsqKmhpZ2ggcG9sYXJpemF0aW9uKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzRdYDsifSBjbGVhcmx5IChlLmcuIGRpZmZlcmVuY2Ugb2YgbnVtZXJpY2FsIHZhbHVlcyBvZiBzYWlkIGRpc3RyaWJ1dGlvbnMgYXJlIGJpZyksIHdlIHdvdWxkIGNvcnJlY3RseSBjYXRlZ29yaXplIHRoZW0gbW9yZSBvZnRlbiBhY2NvcmRpbmcgdG8gdGhlIHRocmVzaG9sZC4gIA0KDQotIFVzaW5nIHRoZSBsb2dpYyBmcm9tIHRoZSBwcmV2aW91cyBwb2ludCwgaWYgdGhlIG1vZGVsIGl0c2VsZiBpcyBhY2N1cmF0ZSwgc2V0dGluZyB0aGUgdGhyZXNob2xkIGlzIG5vdCBhcyBpbXBvcnRhbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcG9sYXJpemF0aW9uIG1lYXN1cmUgZ2l2ZXMgdHdvIG51bWVyaWNhbCBvdXRwdXRzIGZvciB0d28gZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMgbGlrZSAuMiBhbmQgLjksIHRoZW4gc2V0dGluZyB0aGUgdGhyZXNob2xkIGF0IC41IG9yIC42IHdvdWxkIG5vdCBtYXR0ZXIgZm9yIHRoZSBjYXRlZ29yaXphdGlvbiBpdHNlbGYuIEluIGNvbnNlcXVlbmNlLCBpZiB0aGUgbWVhc3VyZSBpcyBwcmV0dHkgYmFkIGF0IGRpc3Rpbmd1aXNoaW5nIHRoZSBkaXN0cmlidXRpb25zLCBsaWtlIC41IGFuZCAuNiwgdGhlbiB3ZSBoYXZlIGxlc3MgbWFyZ2luIGZvciBlcnJvciByZWdhcmRpbmcgdGhlIHRocmVzaG9sZCBzZWxlY3Rpb24sIGFzIHRoZSB0aHJlc2hvbGRzIGl0c2VsZiBuZWVkcyB0byBiZSBzZXQgaW4gYmV0d2VlbiB0aG9zZSB2YWx1ZXMgdG8gY2F0ZWdvcml6ZSB0aGVtIGNvcnJlY3RseS4gIA0KDQotIFNldHRpbmcgdGhlIHRocmVzaG9sZCBtYXkgaW5jcmVhc2UgdHJ1ZSBwb3NpdGl2ZXMgYXQgdGhlIGV4cGVuc2Ugb2YgZmFsc2UgcG9zaXRpdmVzIGFuZCB2aWNlIHZlcmNhLiBPbmUgY2FuIGFsd2F5cyBzZXQgdGhlIHRocmVzaG9sZCBhdCAuMSBvciAuOSwgdGh1cyBoYXZpbmcgYSBsb3cgb3IgaGlnaCBlbnRyeSBwb2ludCB3aGVyZSBvbmUgd291bGQgY2xhc3NpZnkgcG9sYXJpemF0aW9uICh0aHVzIHRha2luZyBhIGxpYmVyYWwgb3IgY29uc2VydmF0aXZlIGFwcHJvYWNoKS4gICAgDQoNClRha2luZyBhbGwgb2YgdGhlc2UgcG9pbnRzIGludG8gYWNjb3VudCwgdGhlIHBvd2VyIGFuYWx5c2lzIHJlc3VsdHMgbWFpbmx5IGhpbmdlcyBvbiB0aGUgcG9sYXJpemF0aW9uIG1lYXN1cmVtZW50cyBpdHNlbGYgYW5kIGhvdyBmaXR0aW5nIHRoZSB0aHJlc2hvbGQgd2VyZSBzZXQuICANCg0KIyBSZXN1bHRzIA0KDQojIyBPdmVyYWxsIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyBQb2xhcml6YXRpb24gVmFsdWVzIGZvciB0aGUgUG9wdWxhdGlvbiBEaXN0cmlidXRpb24NCg0KYGBge3IgRGlzcGxheSBQb2xhcml6YXRpb24gTWVhc3VyZXMgZm9yIGFsbCBEaXN0cmlidXRpb25zfQ0KQkNfcG9wIDwtIGFwcGx5KHJvdF9Qb3BfZGYsIDEsIGNhbGNfYmltb2RhbGl0eV9jb2VmZmljaWVudCkNCkdEX3BvcCA8LSBhcHBseShyb3RfUG9wX2RmLCAxLCBjYWxjX2dyb3VwX2RpdmVyZ2VuY2UpIA0KUG9sX3BvcDwtIGFwcGx5KHJvdF9Qb3BfZGYsIDEsIGNhbGNfcG9sYXJpemF0aW9uKQ0KUG9sX21lYXN1cmVzX3BvcCA8LSBkYXRhLmZyYW1lKEJDX3BvcCwgR0RfcG9wLCBQb2xfcG9wKQ0KUG9sX21lYXN1cmVzX3BvcCRgUG9sLiBEaXN0cmlidXRpb25gIDwtIHJvd25hbWVzKFBvbF9tZWFzdXJlc19wb3ApDQoNClBvbF9tZWFzdXJlc19wb3AgJT4lIA0KICAgc2VsZWN0KGBQb2wuIERpc3RyaWJ1dGlvbmAsIGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICAga2FibGUoZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgIGNhcHRpb24gPSAiUG9sYXJpemF0aW9uIE1lYXN1cmVzIGluIHRoZSBQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbnMiLCANCiAgICAgICAgIGRpZ2l0cyA9IDMsIA0KICAgICAgICAgY29sLm5hbWVzID0gYygiUG9wdWxhdGlvbiBEaXN0cmlidXRpb24iLCAiQmltb2RhbGl0eSBDb2VmZmljaWVudCIsICJHcm91cCBEaXZlcmdlbmNlIiwgIlBvbGFyaXphdGlvbiIpLCANCiAgICAgICAgIGFsaWduID0gImMiLA0KICAgICAgICAgcm93Lm5hbWVzID0gRkFMU0UpICU+JSANCiAgIGthYmxlRXh0cmE6OnJvd19zcGVjKHJvdyA9IDAsIGFuZ2xlID0gLTEwKQ0KYGBgDQoNCiMjIyBEcmF3biBTYW1wbGUgVGFibGUgDQpgYGB7ciBDcmVhdGUgRGljaG90b21lIGZhY3RvciBvZiBQb2xhcml6ZWQgYW5kIE5vbmUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojZm9yIGVhY2ggbWVhc3VyZSwgdXNlIHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBpbiB0aGUgbWV0aG9kcyBzZWN0aW9uDQpjb21iaW5lZF9yZXN1bHRfbWVhc3VyZXMgPC0gY29tYmluZWRfcmVzdWx0X21lYXN1cmVzICU+JSANCiAgIG11dGF0ZShCQ19Qb2wgPSBpZl9lbHNlKEJDX3Jlc3VsdCA+PSBCQ190aHJlc2hvbGQsIDEsIDApLA0KICAgICAgICAgIHBvbGFyaXphdGlvbl9Qb2wgPSBpZl9lbHNlKHBvbGFyaXphdGlvbl9yZXN1bHQgPj0gcG9sYXJpemF0aW9uX3RocmVzaG9sZCwgMSwgMCksDQogICAgICAgICAgZ3JvdXBfZGl2ZXJnZW5jZV9Qb2wgPSBpZl9lbHNlKGdyb3VwX2RpdmVyZ2VuY2VfcmVzdWx0ID49IGdyb3VwX2RpdmVyZ2VuY2VfdGhyZXNob2xkLCAxLCAwKSwNCiAgICAgICAgICB0cmFuc2xfcmlza19kaXN0ciA9IGZhY3RvcihyaXNrX2Rpc3RyaWJ1dGlvbiwgbGFiZWxzID0gYygiTm9uZSIsICJTbWFsbCBQb2wuIiwgIlJhcmUiLCAiU3Ryb25nIFBvbC4iKSkpDQoNCg0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgPC0gY29tYmluZWRfcmVzdWx0X21lYXN1cmVzICU+JSANCiAgIHBpdm90X2xvbmdlcihjb250YWlucygiX1BvbCIpLCBuYW1lc190byA9ICJNZWFzdXJlIiwgdmFsdWVzX3RvID0gImlzX3BvbGFyaXplZCIpICU+JSANCiAgIG11dGF0ZShNZWFzdXJlID0gc3RyX3JlbW92ZShNZWFzdXJlLCAiX1BvbCIpKSAlPiUNCiAgIGdyb3VwX2J5KE1lYXN1cmUsdHJhbnNsX3Jpc2tfZGlzdHIsIHNhbXBsZV9zaXplKSAlPiUgDQogICBzdW1tYXJpc2UoYFByb3BfYXNfcG9sYXJpemVkX2luXyVgID0gc3VtKGlzX3BvbGFyaXplZCkvcmVwbGljYXRpb25zX3Blcl9zZXR0aW5nICogMTAwKSU+JSANCiAgIHVuZ3JvdXAoKSAlPiUgDQogICBtdXRhdGUoTWVhc3VyZSA9IGNhc2Vfd2hlbihNZWFzdXJlID09ICJCQyJ+ICJCaW1vZGFsaXR5IENvZWZmaWNpZW50IiwNCiAgICAgICAgICAgICAgICAgICAgTWVhc3VyZSA9PSAiZ3JvdXBfZGl2ZXJnZW5jZSIgfiAiR3JvdXAgRGl2ZXJnZW5jZSIsDQogICAgICAgICAgICAgICAgICAgIE1lYXN1cmUgPT0gInBvbGFyaXphdGlvbiIgfiAiUG9sYXJpemF0aW9uIikpDQoNCnN1bW1hcmlzZWRfcmVzdWx0X21lYXN1cmVzICU+JQ0KICAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBgUHJvcF9hc19wb2xhcml6ZWRfaW5fJWAsDQogICAgICAgICAgICAgICBuYW1lc19mcm9tID0gTWVhc3VyZSkgJT4lIA0KICAgcmVuYW1lKGBQb2xhcml6YXRpb24gR3JhZGVgID0gdHJhbnNsX3Jpc2tfZGlzdHIsIA0KICAgICAgICAgIGBTYW1wbGUgU2l6ZWAgPSBzYW1wbGVfc2l6ZSkgJT4lIA0KICAgcGFnZWRfdGFibGUob3B0aW9ucyA9IGxpc3Qocm93bmFtZXMucHJpbnQgPSBGLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cy5wcmludCA9IGxlbmd0aChzYW1wbGVfc2VxdWVuY2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scy5taW4ucHJpbnQgPSA1KSkNCmBgYA0KIyMjIE92ZXJhbGwgUGxvdA0KYGBge3IgUGxvdCBSZXN1bHRzfQ0KDQpzdW1tYXJpc2VkX3Jlc3VsdF9tZWFzdXJlcyAlPiUNCiAgIGdncGxvdChhZXMoc2FtcGxlX3NpemUsIGBQcm9wX2FzX3BvbGFyaXplZF9pbl8lYCwgY29sID0gdHJhbnNsX3Jpc2tfZGlzdHIsIGdyb3VwID0gdHJhbnNsX3Jpc2tfZGlzdHIpKSsNCiAgIGdlb21fbGluZShsaW5ld2lkdGggPSAuOSkrDQogICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKE1lYXN1cmUpKSsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzYW1wbGVfc2VxdWVuY2UpKw0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykrDQogICB0aGVtZV9taW5pbWFsKCkrDQogICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpKw0KICAgZ2VvbV90ZXh0KGFlcyh4PSBzYW1wbGVfc2VxdWVuY2VbbGVuZ3RoKHNhbXBsZV9zZXF1ZW5jZSkvMisgM10seSA9IDUwLCBsYWJlbD0gTWVhc3VyZSksIHNpemUgPSA3LCBpbmhlcml0LmFlcyA9IEZBTFNFKSsNCiAgIHlsYWIoIk1lYXN1cmUgSW5kaWNhdGVkIFBvbGFyaXphdGlvbiAoaW4gJSkiKSsNCiAgIHhsYWIoIlNhbXBsZSBTaXplIikNCg0KDQpgYGANCg0KIyMgQmltb2RhbGl0eSBDb2VmZmljaWVudHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyBQbG90DQpgYGB7ciBJbmRpdmlkdWFsIFBsb3RzOiBCaW1vZGFsaXR5IENvZWZmaWNpZW50fQ0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgJT4lIA0KICAgZmlsdGVyKE1lYXN1cmUgPT0gIkJpbW9kYWxpdHkgQ29lZmZpY2llbnQiKSAlPiUgDQogICBnZ3Bsb3QoYWVzKHNhbXBsZV9zaXplLCBgUHJvcF9hc19wb2xhcml6ZWRfaW5fJWAsIGNvbCA9IHRyYW5zbF9yaXNrX2Rpc3RyLCBncm91cCA9IHRyYW5zbF9yaXNrX2Rpc3RyKSkrDQogICBnZW9tX2xpbmUobGluZXdpZHRoID0gMS4xKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2FtcGxlX3NlcXVlbmNlKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwxMDAsIGJ5ID0gMTApKSsNCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpKw0KICAgdGhlbWVfbWluaW1hbCgpKw0KICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSsNCiAgIGdlb21fdGV4dChhZXMoeD0gc2FtcGxlX3NlcXVlbmNlW2xlbmd0aChzYW1wbGVfc2VxdWVuY2UpLzIrIDNdLHkgPSA1MCwgbGFiZWw9IE1lYXN1cmUpLCBzaXplID0gNywgaW5oZXJpdC5hZXMgPSBGQUxTRSkrDQogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjKDgwLDkwKSAsIGNvbD1jKCJibGFjayIsImJsdWUiKSwgbGluZXR5cGU9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAuOCkrDQogICB5bGFiKCJNZWFzdXJlIEluZGljYXRlZCBQb2xhcml6YXRpb24gKGluICUpIikrDQogICB4bGFiKCJTYW1wbGUgU2l6ZSIpKw0KICAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDE3MCwgeSA9IDgyLCBsYWJlbD0gIlBvd2VyIG9mIC44IiwgY29sID0gImJsYWNrIikrDQogICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gMTcwLCB5ID0gOTIsIGxhYmVsPSAiUG93ZXIgb2YgLjkiLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KICANCiMjIyBCaW1vZGFsaXR5IENvZWZmaWNpZW50IFRhYmxlDQpgYGB7ciBCaW1vZGFsaXR5IFRhYmxlfQ0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgJT4lIA0KICAgZmlsdGVyKE1lYXN1cmUgPT0gIkJpbW9kYWxpdHkgQ29lZmZpY2llbnQiKSU+JSANCiAgIHJlbmFtZShgUG9sYXJpemF0aW9uIEdyYWRlYCA9IHRyYW5zbF9yaXNrX2Rpc3RyLCANCiAgICAgICAgICBgU2FtcGxlIFNpemVgID0gc2FtcGxlX3NpemUsDQogICAgICAgICAgYEluZGljYXRpb24gdG93YXJkcyBQb2xhcml6YXRpb24gKGluICUpYCA9IGBQcm9wX2FzX3BvbGFyaXplZF9pbl8lYCkgJT4lIA0KICAgc2VsZWN0KC1NZWFzdXJlKSAlPiUgDQogICBwYWdlZF90YWJsZShvcHRpb25zID0gbGlzdChyb3duYW1lcy5wcmludCA9IEYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzLnByaW50ID0gbGVuZ3RoKHNhbXBsZV9zZXF1ZW5jZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzLm1pbi5wcmludCA9IDUpKQ0KYGBgDQojIyBHcm91cCBEaXZlcmdlbmNley50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIFBsb3QNCmBgYHtyIEluZGl2aWR1YWwgUGxvdHM6IEdyb3VwIERpdmVyZ2VuY2V9DQpzdW1tYXJpc2VkX3Jlc3VsdF9tZWFzdXJlcyAlPiUgDQogICBmaWx0ZXIoTWVhc3VyZSA9PSAiR3JvdXAgRGl2ZXJnZW5jZSIpICU+JSANCiAgIGdncGxvdChhZXMoc2FtcGxlX3NpemUsIGBQcm9wX2FzX3BvbGFyaXplZF9pbl8lYCwgY29sID0gdHJhbnNsX3Jpc2tfZGlzdHIsIGdyb3VwID0gdHJhbnNsX3Jpc2tfZGlzdHIpKSsNCiAgIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjEpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzYW1wbGVfc2VxdWVuY2UpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEwMCwgYnkgPSAxMCkpKw0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykrDQogICB0aGVtZV9taW5pbWFsKCkrDQogICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpKw0KICAgZ2VvbV90ZXh0KGFlcyh4PSBzYW1wbGVfc2VxdWVuY2VbbGVuZ3RoKHNhbXBsZV9zZXF1ZW5jZSkvMisgM10seSA9IDUwLCBsYWJlbD0gTWVhc3VyZSksIHNpemUgPSA3LCBpbmhlcml0LmFlcyA9IEZBTFNFKSsNCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoODAsOTApICwgY29sPWMoImJsYWNrIiwiYmx1ZSIpLCBsaW5ldHlwZT0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IC44KSsNCiAgIHlsYWIoIk1lYXN1cmUgSW5kaWNhdGVkIFBvbGFyaXphdGlvbiAoaW4gJSkiKSsNCiAgIHhsYWIoIlNhbXBsZSBTaXplIikrDQogICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gMTcwLCB5ID0gODIsIGxhYmVsPSAiUG93ZXIgb2YgLjgiLCBjb2wgPSAiYmxhY2siKSsNCiAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxNzAsIHkgPSA5MiwgbGFiZWw9ICJQb3dlciBvZiAuOSIsIGNvbCA9ICJibHVlIikNCg0KYGBgDQogIA0KIyMjIEdyb3VwIERpdmVyZ2VuY2UgVGFibGUNCmBgYHtyIEdyb3VwIERpdmVyZ2VuY2UgVGFibGV9DQpzdW1tYXJpc2VkX3Jlc3VsdF9tZWFzdXJlcyAlPiUgDQogICBmaWx0ZXIoTWVhc3VyZSA9PSAiR3JvdXAgRGl2ZXJnZW5jZSIpJT4lIA0KICAgcmVuYW1lKGBQb2xhcml6YXRpb24gR3JhZGVgID0gdHJhbnNsX3Jpc2tfZGlzdHIsIA0KICAgICAgICAgIGBTYW1wbGUgU2l6ZWAgPSBzYW1wbGVfc2l6ZSwNCiAgICAgICAgICBgSW5kaWNhdGlvbiB0b3dhcmRzIFBvbGFyaXphdGlvbiAoaW4gJSlgID0gYFByb3BfYXNfcG9sYXJpemVkX2luXyVgKSAlPiUgDQogICBzZWxlY3QoLU1lYXN1cmUpICU+JSANCiAgIHBhZ2VkX3RhYmxlKG9wdGlvbnMgPSBsaXN0KHJvd25hbWVzLnByaW50ID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHJpbnQgPSBsZW5ndGgoc2FtcGxlX3NlcXVlbmNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMubWluLnByaW50ID0gNSkpDQoNCg0KYGBgDQojIyBQb2xhcml6YXRpb257LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMgUGxvdA0KYGBge3IgSW5kaXZpZHVhbCBQbG90czogUG9sYXJpemF0aW9ufQ0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgJT4lIA0KICAgZmlsdGVyKE1lYXN1cmUgPT0gIlBvbGFyaXphdGlvbiIpICU+JSANCiAgIGdncGxvdChhZXMoc2FtcGxlX3NpemUsIGBQcm9wX2FzX3BvbGFyaXplZF9pbl8lYCwgY29sID0gdHJhbnNsX3Jpc2tfZGlzdHIsIGdyb3VwID0gdHJhbnNsX3Jpc2tfZGlzdHIpKSsNCiAgIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjEpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzYW1wbGVfc2VxdWVuY2UpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEwMCwgYnkgPSAxMCkpKw0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykrDQogICB0aGVtZV9taW5pbWFsKCkrDQogICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpKw0KICAgZ2VvbV90ZXh0KGFlcyh4PSBzYW1wbGVfc2VxdWVuY2VbbGVuZ3RoKHNhbXBsZV9zZXF1ZW5jZSkvMisgM10seSA9IDUwLCBsYWJlbD0gTWVhc3VyZSksIHNpemUgPSA3LCBpbmhlcml0LmFlcyA9IEZBTFNFKSsNCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoODAsOTApICwgY29sPWMoImJsYWNrIiwiYmx1ZSIpLCBsaW5ldHlwZT0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IC44KSsNCiAgIHlsYWIoIk1lYXN1cmUgSW5kaWNhdGVkIFBvbGFyaXphdGlvbiAoaW4gJSkiKSsNCiAgIHhsYWIoIlNhbXBsZSBTaXplIikrDQogICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gMTcwLCB5ID0gODIsIGxhYmVsPSAiUG93ZXIgb2YgLjgiLCBjb2wgPSAiYmxhY2siKSsNCiAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxNzAsIHkgPSA5MiwgbGFiZWw9ICJQb3dlciBvZiAuOSIsIGNvbCA9ICJibHVlIikNCg0KYGBgDQogIA0KIyMjIFBvbGFyaXphdGlvbiBUYWJsZQ0KYGBge3IgUG9sYXJpemF0aW9uIFRhYmxlfQ0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgJT4lIA0KICAgZmlsdGVyKE1lYXN1cmUgPT0gIlBvbGFyaXphdGlvbiIpJT4lIA0KICAgcmVuYW1lKGBQb2xhcml6YXRpb24gR3JhZGVgID0gdHJhbnNsX3Jpc2tfZGlzdHIsIA0KICAgICAgICAgIGBTYW1wbGUgU2l6ZWAgPSBzYW1wbGVfc2l6ZSwNCiAgICAgICAgICBgSW5kaWNhdGlvbiB0b3dhcmRzIFBvbGFyaXphdGlvbiAoaW4gJSlgID0gYFByb3BfYXNfcG9sYXJpemVkX2luXyVgKSAlPiUgDQogICBzZWxlY3QoLU1lYXN1cmUpICU+JSANCiAgIHBhZ2VkX3RhYmxlKG9wdGlvbnMgPSBsaXN0KHJvd25hbWVzLnByaW50ID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHJpbnQgPSBsZW5ndGgoc2FtcGxlX3NlcXVlbmNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMubWluLnByaW50ID0gNSkpDQpgYGANCg0KDQojIERpc2N1c3Npb24NCg0KTG9va2luZyBvdmVyIHRoZSByZXN1bHRzLCB0aGUgbWVhc3VyZXMgb2YgZ3JvdXAgZGl2ZXJnZW5jZSBhbmQgcG9sYXJpemF0aW9uIHdlcmUgb2Ygbm8gaGVscC4gVHdvIHBvc3NpYmxlIGV4cGxhbmF0aW9ucyAod2hpY2ggaXMgYWxyZWFkeSBkaXNjdXNzZWQgZnVydGhlciBhYm92ZSkgY29tZSB0byBtaW5kOiAgDQoNCi0gVGhlIHRocmVzaG9sZHMgd2VyZSBub3Qgb3B0aW1hbGx5IHNldCAoZS5nLiBpZiB0aGUgdGhyZXNob2xkIHdlcmUgc2V0IGluIGEgYmV0dGVyIHBvc2l0aW9uLCB0aGVuIHdlIGFyZSBtb3JlIGxpa2VseSB0byBmaW5kIHBvbGFyaXphdGlvbiwgYXQgdGhlIGNvc3Qgb2YgZmluZGluZyBmYWxzZSBwb3NpdGl2ZXMgYXMgd2VsbCkuIEZvciBleGFtcGxlLCB0aGUgdGhyZXNob2xkIGZvciBncm91cCBkaXZlcmdlbmNlIHdhcyB0b28gaGlnaCwgc28gaXQgbmV2ZXIgY2F0ZWdvcml6ZWQgdGhlIFsqKnNtYWxsIHBvbGFyaXphdGlvbioqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1syXWA7In0gZGlzdHJpYnV0aW9uIGFzIHBvbGFyaXplZC4gSW4gdGhpcyBjYXNlLCB3ZSd2ZSByZXN0cmFpbmVkIHRoZSBlZmZlY3Qgc2l6ZSB0byBiZSBhdCBsZWFzdCBhdCBgYHIgZ3JvdXBfZGl2ZXJnZW5jZV90aHJlc2hvbGRgYCwgd2hpY2ggbWF5IGJlIHRvbyByZXN0cmljdGl2ZSBmb3IgdGhpcyBtZWFzdXJlLiAgDQoNCi0gVGhlIG1lYXN1cmUgaXRzZWxmIGhhdmUgZGlmZmljdWx0aWVzIGRpc3Rpbmd1aXNoaW5nIHBvbGFyaXphdGlvbiAob3IgYXQgbGVhc3QgaG93IEkgZGVmaW5lZCBwb2xhcml6YXRpb24pLiBUYWtlIGZvciBleGFtcGxlIHRoZSBbKipyYXJlKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzNdYDsifSBkaXN0cmlidXRpb24sIHdoaWNoIEkgZGVmaW5lZCBhcyB0cnVseSBwb2xhcml6ZWQsIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIFsqKm5vdCBwb2xhcml6ZWQqKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbMV1gOyJ9IGRpc3RyaWJ1dGlvbi4gVGhlaXIgdmFsdWVzIGFyZSBuZWFyIGlkZW50aWNhbC4gQXMgYSByZW1pbmRlciwgcG9sYXJpemF0aW9uIHVzZXMgd2VpZ2h0ZWQgc3VtcyB0byBjYWxjdWxhdGUgcG9sYXJpemF0aW9uLiBJbiBjb25zZXF1ZW5jZSwgaXQgaWdub3JlcyB0aGUgbWlub3JpdHkgZ3JvdXAgaW4gdGhlIHJhcmUgZGlzdHJpYnV0aW9uLCBhbmQgZm9jdXNlcyBvbiB0aGUgYmlnZ2VyIGdyb3VwIG9uIHRoZSBsZWZ0LCB3aGljaCBqdXN0IGhhcHBlbnMgdG8gYmUgYSBza2V3ZWQgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gIA0KDQpPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIEJDIGRlbGl2ZXJzIGEgdG90YWxseSBhY2NlcHRhYmxlIGFuZCBsb2dpY2FsIG91dHB1dDogIA0KDQotIEFsbCBwb2xhcml6ZWQgZGlzdHJpYnV0aW9ucyBhcmUgY2F0ZWdvcml6ZWQgYXMgcG9sYXJpemVkLCB3aGVyZWFzIHRoZSBkaXN0cmlidXRpb24gWyoqd2l0aG91dCBwb2xhcml6YXRpb24qKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbMV1gOyJ9IGlzIGNhdGVnb3JpemVkIGFzIG5vdCBwb2xhcml6ZWQuICANCg0KLSBXaXRoIGluY3JlYXNlZCBzYW1wbGUgc2l6ZSwgd2UgaGF2ZSBtb3JlIHBvd2VyLiAgDQoNCi0gVGhlIFsqKnN0cm9uZ2x5IHBvbGFyaXplZCBkaXN0cmlidXRpb24qKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbNF1gOyJ9IHJlYWNoZXMgYSBoaWdoIHBvd2VyIGxldmVsIHRoZSBmYXN0ZXN0LCB3aGVyYXMgWyoqc21hbGwqKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbMl1gOyJ9IGFuZCBbKipyYXJlKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzNdYDsifSBwb2xhcml6YXRpb25zIGFyZSBzbG93ZXIgZHVlIHRvIHRoZWlyIGltcGxpZWQgZWZmZWN0IHNpemVzLiBCYXJlIGluIG1pbmQgdGhhdCByYXJlIGRpc3RyaWJ1dGlvbnMgbmVlZCBiaWdnZXIgc2FtcGxlIHNpemVzLCBzbyB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBzYW1wbGluZyBmcm9tIHRoZSBtaW5vcml0eSBncm91cCBpcyBzdWZmaWNpZW50bHkgaGlnaC4gIA0KDQpCdXQgb24gYSBtb3JlIHRob3JvdWdoIGludmVzdGlnYXRpb24sIHdlIHNlZSB0aGF0IHRoZSBzaW11bGF0aW9uIGZvciB0aGUgQkMgaW5kaWNhdGVzIGEgKipzYW1wbGUgc2l6ZSBvZiAyMCBhbmQgMzAqKiBpcyBlbm91Z2ggdG8gZ2V0IGEgcG93ZXIgb2YgODAlIGZvciB0aGUgWyoqc21hbGwgcG9sYXJpemF0aW9uIGRpc3RyaWJ1dGlvbioqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1syXWA7In0gYW5kIFsqKnJhcmUgZGlzdHJpYnV0aW9uKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzNdYDsifSByZXNwZWN0aXZlbHkuLi4uIEludGVycHJldGluZyB0aGlzIHJlc3VsdCBpbiBhIG1vcmUgZmF2b3JhYmxlIHdheSwgaXQgc2VlbXMgbGlrZSB3ZSd2ZSBvbmx5IGZvdW5kIHRoZSBiYXJlIG1pbmltdW0gc2FtcGxlIHNpemUgbmVlZGVkIChhbmQgZXZlbiB0aGlzIGludGVycHJldGF0aW9uIGlzIHNoYWt5LCBhcyB0aGUgc2ltdWxhdGlvbiB1c2VzIHJhbmRvbSBkcmF3cyBpbiBwZXJmZWN0IGNvbmRpdGlvbnMsIHdoaWNoIGRvZXMgbm90IHRyYW5zbGF0ZSB3ZWxsIHRvIG91ciBzdHVkeSkuIEluIGEgbW9yZSByZWFsaXN0aWMgKGFuZCB0aHVzIHBlc3NpbWlzdGljIHdheSksIHRoZSByZXN1bHRzIHNlZW0gdG8gc3VnZ2VzdCB0aGF0IHRoaXMgYXBwcm9hY2ggKGFnYWluKSBkb2VzIG5vdCBzZWVtIHRvIGdpdmUgYSBzYXRpc2ZhY3RvcnkgYW5zd2VyIHRvIG91ciBwcm9ibGVtIGF0IGhhbmQuIEEgc2FtcGxlIHNpemUgb2YgMjAgYW5kIDMwIGlzIHZlcnkgc21hbGwgYW5kIGludHVpdGl2ZWx5IGxlYWRzIHRvIHVucmVsaWFibGUgb3V0Y29tZXMuIFVzaW5nIHN1Y2ggYSBzbWFsbCBzYW1wbGUgc2l6ZSB0byBpbmZlciBob3cgYSBwb3B1bGF0aW9uIHRoaW5rcy8gZmVlbHMgYWJvdXQgY2VydGFpbiByaXNrcyBpcyBvdXQgb2YgdGhlIHF1ZXN0aW9uLiAgDQoNCiMjIExpbWl0YXRpb25zDQoNCi0gT25seSAzIG1lYXN1cmVzIG9mIHBvbGFyaXphdGlvbiB3YXMgdXNlZCwgYW5kIHRodXMsIG5vdCBldmVyeSBhc3BlY3Qgb2YgcG9sYXJpemF0aW9uIHdhcyBjb3ZlcmVkLiAgDQoNCi0gU2V0dGluZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBbKipyYXJlIHBvbGFyaXphdGlvbioqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1szXWA7In0gaXMsIGluIGZhY3QsIHBvbGFyaXplZCwgbWF5IG5vdCBob2xkIHdlbGwgaW4gdGhlIHN0dWR5IGl0c2VsZiwgYXMgb3V0bGllcnMsIG1pc2ludGVycHJldGF0aW9ucyBvciBldmVuIGEgbW91c2Ugc2xpcCBtYXkgY29udHJpYnV0ZSB0byBzdWNoIGEgZGlzdHJpYnV0aW9uLCB3aGljaCB3ZSB3b3VsZCB0aGVuIGp1c3QgYXNzdW1lIGlzIHBvbGFyaXplZC4gIA0KDQotIFRoZSB0aHJlc2hvbGQgd2VyZSBzZXQgc29tZXdoYXQgYXJiaXRyYXJ5LCBhbmQgdGhlcmVmb3JlLCBtYXkgbm90IGhvbGQgaW4gdGhlIHJlYWwgZGVhbC4gT25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gY2hhbmdlIHRoZSB0aHJlc2hvbGQgdG8gZmluZCBhbiBvcHRpbWl6ZWQgb25lIHdoZXJlIHdlIHdvdWxkIGhhdmUgdGhlIGxlYXN0IGZhbHNlIHBvc2l0aXZlcyBhbmQgZmFsc2UgbmVnYXRpdmVzLCBidXQgdGhpcyB0aHJlc2hvbGQgd2lsbCBvbmx5IGZpdCB0aGUgZGlzdHJpYnV0aW9ucyBzZWVuIGhlcmUgYW5kIHdpbGwgbm90IGdlbmVyYWxpemUgZm9yIG90aGVycy4gQXMgc3VjaCwgSSdsbCByZWZyYWluIGZyb20gZmluZGluZyB0aGUgb3B0aW11bSwgYXMgaXQgd291bGQgbm90IG5ldCB1cyBhbnkgYWRkaXRpb25hbCBpbnNpZ2h0IHRvIG91ciBnb2FsLiAgDQoNCi0gTGlrZXdpc2UsIG9uZSBjb3VsZCBzZXQgdGhlIHRocmVzaG9sZHMgZm9yIHRoZSBCQyBldmVuIGhpZ2hlciwgdGh1cyByZXN0cmljdGluZyB0aGUgYW1vdW50IG9mIGFtYml2YWxlbnQgZGlzdHJpYnV0aW9ucyB3aGljaCB3ZXJlIGJhcmVseSBtYWtpbmcgdGhlIGN1dG9mZi4gVGhpcyB3b3VsZCBsZWFkIHRvIGEgZ3JlYXRlciBzYW1wbGUgc2l6ZSBuZWVkZWQsIGJ1dCB3ZSB3b3VsZCBoYXZlIGEgbW9yZSByZWxpYWJsZSBhbmQgaG9wZWZ1bGx5IGEgbW9yZSByZWFsaXN0aWMgYXBwcm94aW1hdGlvbiBvZiBob3cgbWFueSBzYW1wbGVkIG5lZWQgdG8gYmUgZHJhd24uICANCg0KLSBBcyBpbiBhbGwgY2xhc3NpZmljYXRpb24gcHJvYmxlbXMsIHBvbGFyaXphdGlvbiBoYXMgbm8gY2xlYXIgY3V0IGxpbWl0IGFuZCBzaG91bGQgYmUgdW5kZXJzdG9vZCBhcyBhIGdyYWRpZW50IHdoZXJlIHNvbWUgcmlza3MgYXJlIG1vcmUgcG9sYXJpemVkIHRoYW4gb3RoZXJzLiBUaGUgdGhyZXNob2xkIGltcGxpZXMgdGhhdCBkaXN0cmlidXRpb25zIGp1c3Qgc2hvcnQgb2YgdGhlIHRocmVzaG9sZCBpcyBzaWduaWZpY2FudGx5IGxlc3MgcG9sYXJpemVkIHRoZW4gdGhvc2UganVzdCBhYm92ZSBpdCwgd2hpY2ggY2FuJ3QgYmUgZnVydGhlciBmcm9tIHRoZSB0cnV0aC4gIA0KDQotIEluIHRoaXMgc2ltdWxhdGlvbiwgc2FtcGxlcyB3ZXJlIGRyYXduIGF0IHJhbmRvbS4gT3VyIHNhbXBsaW5nIHByb2NlZHVyZSBtYXkgbm90IGJlIGFzIHJhbmRvbSBhcyBpbiB0aGlzIHNpbXVsYXRpb24gKG1heWJlIG9ubHkgdGhvc2Ugd2hvIGFuc3dlciBvdXIgcXVlc3Rpb25uYWlyZXMgYXJlIHRob3NlIG9uIG9uZSBwb2xlLCBhbW9uZyBvdGhlciBzYW1wbGluZyBkaWZmaWN1bHRpZXMpLiAgDQoNCi0gSXQgY291bGQgYWxzbyBiZSB0aGF0IHRoZSBbKioic21hbGwgcG9sYXJpemF0aW9uIioqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1syXWA7In0gaXMgc3RpbGwgYSBiaWcgZWZmZWN0IHNpemUgaW4gdGhlIHJlYWwgd29ybGQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIHVzaW5nIHN1Y2ggYSBzbWFsbCBzYW1wbGUgd2lsbCBvbmx5IGxlYWQgdG8gYSBsYWNrIG9mIHBvd2VyIHRvIGZpbmQgcG9sYXJpemF0aW9uLiAgDQoNCiMjIENvbmNsdXNpb25zDQoNCi0gVGhpcyBhcHByb2FjaCBmYWlsZWQgdG8gZGVsaXZlciBhIGNsZWFyIGN1dCBhbnN3ZXIgaW4gZmluZGluZyB0aGUgbmVlZGVkIHNhbXBsZSBzaXplIHRvIGZpbmQgcG9sYXJpemF0aW9uIGluIGNhc2UgdGhlcmUgaXMgb25lLiAgDQoNCi0gT25seSB0aGUgKipsb3dlciBsaW1pdCoqIHdhcyBmb3VuZCwgYnV0IGR1ZSB0byBudW1lcm91cyByZWFzb25zIG91dGxpbmVkIGluIHRoZSBsaW1pdGF0aW9ucywgaXQgaXMgYWR2aWNlZCB0byBpbmNyZWFzZSB0aGUgbnVtYmVyLi4uICANCg0KLSBGb3IgdGhvc2Ugd2hvIGFyZSBjdXJpb3VzIHdoYXQgd291bGQgaGFwcGVuIGlmIHdlIHdvdWxkIGNoYW5nZSB0aGUgdGhyZXNob2xkcywgZmVlbCBmcmVlIHRvIGRvd25sb2FkIHRoZSBjb2RlIGFuZCBjaGFuZ2UgdGhlIG51bWJlcnMgeW91cnNlbGYuIEkndmUgcHV0IHRoZSB2YXJpYWJsZXMgaW4gdGhlIGZpcnN0IGNodW5rIHNvIGl0IGlzIHByYWN0aWNhbCB0byBkbyBzby4gIA0KDQojIENyZWRpdHMNCg0KIyMgUiBQYWNrYWdlcyBVc2VkDQoNCi0gYWdybXQgKFJ1ZWRpbiBEICgyMDIzKS4gX2Fncm10OiBDYWxjdWxhdGUgQ29uY2VudHJhdGlvbiBhbmQgRGlzcGVyc2lvbiBpbiBPcmRlcmVkIFJhdGluZyBTY2FsZXNfLiBSIHBhY2thZ2UgdmVyc2lvbiAxLjQyLjEyLA0KPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9YWdybXQ+LikgIA0KDQotIGRvUGFyYWxsZWwgKENvcnBvcmF0aW9uIE0sIFdlc3RvbiBTICgyMDIyKS4gX2RvUGFyYWxsZWw6IEZvcmVhY2ggUGFyYWxsZWwgQWRhcHRvciBmb3IgdGhlICdwYXJhbGxlbCcgUGFja2FnZV8uIFIgcGFja2FnZSB2ZXJzaW9uIDEuMC4xNywNCjxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPWRvUGFyYWxsZWw+LikgIA0KDQotIGZvcmVhY2ggKE1pY3Jvc29mdCwgV2VzdG9uIFMgKDIwMjIpLiBfZm9yZWFjaDogUHJvdmlkZXMgRm9yZWFjaCBMb29waW5nIENvbnN0cnVjdF8uIFIgcGFja2FnZSB2ZXJzaW9uIDEuNS4yLCA8aHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1mb3JlYWNoPi4pICANCg0KLSBrbml0ciAoWGllIFkgKDIwMjMpLiBfa25pdHI6IEEgR2VuZXJhbC1QdXJwb3NlIFBhY2thZ2UgZm9yIER5bmFtaWMgUmVwb3J0IEdlbmVyYXRpb24gaW4gUl8uIFIgcGFja2FnZSB2ZXJzaW9uIDEuNDUsIDxodHRwczovL3lpaHVpLm9yZy9rbml0ci8+LikgIA0KDQotIHBzeWNoIChXaWxsaWFtIFJldmVsbGUgKDIwMjMpLiBfcHN5Y2g6IFByb2NlZHVyZXMgZm9yIFBzeWNob2xvZ2ljYWwsIFBzeWNob21ldHJpYywgYW5kIFBlcnNvbmFsaXR5IFJlc2VhcmNoXy4gTm9ydGh3ZXN0ZXJuIFVuaXZlcnNpdHksIEV2YW5zdG9uLCBJbGxpbm9pcy4gUg0KcGFja2FnZSB2ZXJzaW9uIDIuMy45LCA8aHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1wc3ljaD4uKSAgDQoNCi0gUkNvbG9yQnJld2VyIChOZXV3aXJ0aCBFICgyMDIyKS4gX1JDb2xvckJyZXdlcjogQ29sb3JCcmV3ZXIgUGFsZXR0ZXNfLiBSIHBhY2thZ2UgdmVyc2lvbiAxLjEtMywgPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9UkNvbG9yQnJld2VyPi4pICANCg0KLSBybWFya2Rvd24gKEFsbGFpcmUgSiwgWGllIFksIERlcnZpZXV4IEMsIE1jUGhlcnNvbiBKLCBMdXJhc2NoaSBKLCBVc2hleSBLLCBBdGtpbnMgQSwgV2lja2hhbSBILCBDaGVuZyBKLCBDaGFuZyBXLCBJYW5ub25lIFIgKDIwMjMpLiBfcm1hcmtkb3duOiBEeW5hbWljDQpEb2N1bWVudHMgZm9yIFJfLiBSIHBhY2thZ2UgdmVyc2lvbiAyLjI1LCA8aHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vcm1hcmtkb3duPi4pICANCg0KLSB0aWR5dmVyc2UgKFdpY2toYW0gSCwgQXZlcmljayBNLCBCcnlhbiBKLCBDaGFuZyBXLCBNY0dvd2FuIExELCBGcmFuw6dvaXMgUiwgR3JvbGVtdW5kIEcsIEhheWVzIEEsIEhlbnJ5IEwsIEhlc3RlciBKLCBLdWhuIE0sIFBlZGVyc2VuIFRMLCBNaWxsZXIgRSwgQmFjaGUgU00sDQpNw7xsbGVyIEssIE9vbXMgSiwgUm9iaW5zb24gRCwgU2VpZGVsIERQLCBTcGludSBWLCBUYWthaGFzaGkgSywgVmF1Z2hhbiBELCBXaWxrZSBDLCBXb28gSywgWXV0YW5pIEggKDIwMTkpLiDigJxXZWxjb21lIHRvIHRoZSB0aWR5dmVyc2Uu4oCdIF9Kb3VybmFsIG9mDQpPcGVuIFNvdXJjZSBTb2Z0d2FyZV8sICo0Kig0MyksIDE2ODYuIGRvaToxMC4yMTEwNS9qb3NzLjAxNjg2IDxodHRwczovL2RvaS5vcmcvMTAuMjExMDUvam9zcy4wMTY4Nj4uKSAgDQoNCi0gdmlzZGF0IChUaWVybmV5IE4gKDIwMTcpLiDigJx2aXNkYXQ6IFZpc3VhbGlzaW5nIFdob2xlIERhdGEgRnJhbWVzLuKAnSBfSk9TU18sICoyKigxNiksIDM1NS4gZG9pOjEwLjIxMTA1L2pvc3MuMDAzNTUgPGh0dHBzOi8vZG9pLm9yZy8xMC4yMTEwNS9qb3NzLjAwMzU1PiwNCjxodHRwOi8vZHguZG9pLm9yZy8xMC4yMTEwNS9qb3NzLjAwMzU1Pi4pICANCg0KIyMgVXNlIG9mIEFJDQoNCkNoYXRHUFQgMy41IChPcGVuQUkuIDIwMjMsIGh0dHBzOi8vY2hhdC5vcGVuYWkuY29tL2NoYXQpOiAgDQoNCi0gU3ltYmlvdGljIHdyaXRpbmcgb2YgdGhpcyB3aG9sZSBkb2N1bWVudC4gVGhlIGF1dGhvciB3cm90ZSB0aGUgZmlyc3QgZHJhZnQsIGFuZCB1c2VkIHRoZSBMTE0gZm9yIHJlcGhyYXNpbmcgd29yaywgd2hpY2ggd2VyZSBtb3N0bHkgdGFrZW4gYXMgaW5zcGlyYXRpb24uIEFsbCBzZWN0aW9ucyB3ZXJlIGVxdWFsbHkgYWZmZWN0ZWQu